/**
 * @(#)IdentificacionK.java 26/08/06
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 26/08/06
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <br/>26/08/06 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.
 * <li>14/01/07 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Se quito del paquete com.psiqueware.tulipan.personas y se le asigno su propio paquete.</li>
 * <li>14/01/07 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Se cambio el userName por identificacion y el password por autentificacion pensando en algun hack por introspeccion.</li>
 */

package com.psiqueware.alheli.id.modelo;

import com.psiqueware.alheli.basico.BaseObject;
import com.psiqueware.alheli.exception.NullArgumentException;
import com.psiqueware.alheli.id.Dominio;
import com.psiqueware.alheli.id.Identificacion;
import com.psiqueware.alheli.id.Usuario;

import java.util.Date;


/**
 * Informacion de autenticacion de un usuario.
 * <br/>Paquete Original: com.psiqueware.basico.id.modelo
 * <br/>Nombre  Original: IdentificacionK
 * <br/><a href="IdentificacionK.java.html"><i>Ver C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@psiqueware.com">Angel Electrico</a>
 * @version Revision: 1.0 26/08/06
 * @noinspection ClassWithoutLogger, ClassNamingConvention
 */

public final class IdentificacionK extends BaseObject implements Identificacion
{

    /**
     * Nombre de usuario a identificar.
     */
    private String m_identificacion;

    /**
     * Contrase&ntilde;a del usuario.
     */
    private char[] m_autentificacion = null;

    /**
     * {@link Usuario} due&ntilde;o de la informacion de autenticacion.
     */
    private Usuario m_usuario;

    /**
     * Identificador &uacute;nico del {@link Usuario} al que pertenece este {@link Identificacion}.
     */
    private Long m_idUsuario;

    /**
     * Fecha de la ultima vez que el usuario entro al sistema.
     */
    private Date m_ultimoInicioSesion;

    /**
     * Dice si este {@link Identificacion} se encuentra activo
     */
    private Boolean m_activo = Boolean.FALSE;

    /**
     * Clave de activacion de este {@link Identificacion}. Es un numero que nos va a decir si se puede activar este {@link Identificacion}.
     */
    private String m_claveActivacion;

    /**
     * Clave de regeneraci&oacute;n de este {@link Identificacion}. Es un numero que nos va a decir si se puede regenerar este {@link Identificacion}.
     */
    private String m_claveRegeneracion;

    /**
     * Fecha en la que expira la clave de regeneraci&oacute;n o activaci&oacute;n.
     */
    private Date m_expiracionCambios;

    /**
     * Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     */
    private Long m_idDominio;

    /**
     * Construye una IdentificacionK.
     * <p>No requiere argumentos.</p>
     */
    public IdentificacionK()
    {
    }

    /**
     * Construye una IdentificacionK.
     *
     * @param autentificacion informacion de validacion de que la {@link Usuario} es quien dice.
     * @param usuario         {@link Usuario} que se esta logeando.
     */
    public IdentificacionK(Usuario usuario, char[] autentificacion)
    {
        setIdentificacion(usuario.getIdentificacion());
        setAutentificacion(autentificacion);
        setUsuario(usuario);
        m_idDominio = usuario.getIdDominio();
        m_activo = Boolean.FALSE;
        m_ultimoInicioSesion = new Date();
    }

    /**
     * Establece que este {@link Identificacion} se ha utilizado.
     */
    public void logear()
    {
        m_ultimoInicioSesion = new Date();
    }

    /**
     * Si coincide la clave de activacion del {@link Identificacion} lo activa.
     *
     * @param clave que se pretende sea la misma que la de este {@link Identificacion}.
     *
     * @return <code>true</code> si se pudo activar el {@link Identificacion}; <code>false</code> en caso contrario.
     *
     * @noinspection BooleanMethodNameMustStartWithQuestion, CallToStringEquals
     */
    public boolean activar(String clave)
    {
        if (null == clave) throw new NullArgumentException("<error>El argumento 'clave' no puede ser NULL.</error>");
        assert (null != m_claveActivacion) : ("<error>El atributo 'm_claveActivacion' no deb&iacute;a ser NULL para que esta operaci&oacute;n sea v&aacute;lida.</error>");

        m_activo = m_claveActivacion.equals(clave);
        return m_activo;
    }

    /**
     * Devuelve el UserName de este {@link Identificacion}.
     *
     * @return m_userName
     */
    public String getIdentificacion()
    {
        return m_identificacion;
    }

    /**
     * Establece el Nombre de usuario a identificar.
     *
     * @param identificacion nuevo valor para 'identificacion'.
     */
    public final void setIdentificacion(String identificacion)
    {
        m_identificacion = identificacion;
    }

    /**
     * Devuelve el m_Contrase&ntilde;a de este {@link Identificacion}.
     *
     * @return m_Contrase&ntilde;a
     */
    public char[] getAutentificacion()
    {
        return m_autentificacion.clone();
    }

    /**
     * Establece el Contrase&ntilde;a del usuario.
     *
     * @param autentificacion nuevo valor para 'autentificacion'.
     *
     * @see char[]
     */
    public final void setAutentificacion(char[] autentificacion)
    {
        this.m_autentificacion = null == autentificacion ? null : autentificacion.clone();
    }


    /**
     * Devuelve el Fecha de la ultima vez que el usuario entro al sistema.
     *
     * @return valor de 'ultimoLogeo'.
     *
     * @see Date
     */
    public Date getUltimoInicioSesion()
    {
        return new Date(m_ultimoInicioSesion.getTime());
    }

    /**
     * Establece el Fecha de la ultima vez que el usuario entro al sistema.
     *
     * @param ultimoInicioSesion nuevo valor para 'ultimoInicioSesion'.
     *
     * @see Date
     */
    public void setUltimoInicioSesion(Date ultimoInicioSesion)
    {
        m_ultimoInicioSesion = new Date(ultimoInicioSesion.getTime());
    }


    /**
     * Devuelve el {@link Usuario} due&ntilde;a de la informacion de autenticacion.
     *
     * @return valor de 'usuario'.
     *
     * @see UsuarioK
     */
    public Usuario getUsuario()
    {
        return m_usuario;
    }

    /**
     * Establece el {@link Usuario} due&ntilde;a de la informacion de autenticacion.
     *
     * @param usuario nuevo valor para 'usuario'.
     *
     * @see UsuarioK
     */
    public final void setUsuario(Usuario usuario)
    {
        m_usuario = usuario;
        if (null != usuario) m_idUsuario = usuario.getId();
    }

    /**
     * Devuelve el Dice si este {@link Identificacion} se encuentra activo
     *
     * @return valor de 'activo'.
     *
     * @see Boolean
     */
    public Boolean getActivo()
    {
        return m_activo;
    }

    /**
     * Establece el Dice si este {@link Identificacion} se encuentra activo
     *
     * @param activo nuevo valor para 'activo'.
     *
     * @see Boolean
     */
    public void setActivo(Boolean activo)
    {
        m_activo = activo;
    }

    /**
     * Devuelve el Clave de activacion de este {@link Identificacion}. Es un numero que nos va a decir si se puede activar este {@link Identificacion}.
     *
     * @return valor de 'claveActivacion'.
     */
    public String getClaveActivacion()
    {
        return m_claveActivacion;
    }

    /**
     * Establece el Clave de activacion de este {@link Identificacion}. Es un numero que nos va a decir si se puede activar este {@link Identificacion}.
     *
     * @param claveActivacion nuevo valor para 'claveActivacion'.
     */
    public void setClaveActivacion(final String claveActivacion)
    {
        m_claveActivacion = claveActivacion;
    }

    /**
     * Returns the Identificador &uacute;nico del {@link Usuario} al que pertenece este {@link Identificacion}.
     *
     * @return the value from 'idUsuario'.
     */
    public Long getIdUsuario()
    {
        return m_idUsuario;
    }

    /**
     * Establece el Identificador &uacute;nico del {@link Usuario} al que pertenece este {@link Identificacion}.
     *
     * @param idUsuario nuevo valor para 'idUsuario'.
     */
    public void setIdUsuario(Long idUsuario)
    {
        this.m_idUsuario = idUsuario;
    }

    /**
     * Devuelve el Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     *
     * @return valor de 'idDominio'.
     */
    public Long getIdDominio()
    {
        return m_idDominio;
    }

    /**
     * Establece el Identificador &uacute;nico del {@link Dominio} que permite tener 2 o mas {@link Usuario}s con una misma identificaci&oacute;n siempre que
     * pertenezcan a diferentes dominios.
     * <p/>
     * En caso de no nuecesitarse puede ser <code>null</code>.
     *
     * @param idDominio nuevo valor para 'idDominio'.
     */
    public void setIdDominio(final Long idDominio)
    {
        m_idDominio = idDominio;
    }

    /**
     * Devuelve la Clave de regeneraci&oacute;n de este {@link Identificacion}. Es un numero que nos va a decir si se puede regenerar este {@link Identificacion}.
     *
     * @return valor de 'm_claveRegeneracion'.
     */
    public String getClaveRegeneracion()
    {
        return m_claveRegeneracion;
    }

    /**
     * Establece la Clave de regeneraci&oacute;n de este {@link Identificacion}. Es un numero que nos va a decir si se puede regenerar este {@link Identificacion}.
     *
     * @param claveRegeneracion nuevo valor para 'm_claveRegeneracion'.
     */
    public void setClaveRegeneracion(final String claveRegeneracion)
    {
        m_claveRegeneracion = claveRegeneracion;
    }

    /**
     * Devuelve la Fecha en la que expira la clave de regeneraci&oacute;n o activaci&oacute;n.
     *
     * @return valor de 'm_expiracionCambios'.
     */
    public Date getExpiracionCambios()
    {
        return m_expiracionCambios;
    }

    /**
     * Establece la Fecha en la que expira la clave de regeneraci&oacute;n o activaci&oacute;n.
     *
     * @param expiracionCambios nuevo valor para 'm_expiracionCambios'.
     */
    public void setExpiracionCambios(final Date expiracionCambios)
    {
        m_expiracionCambios = expiracionCambios;
    }

    @Override
    public String toString()
    {
        return "IdentificacionK{" +
                "m_identificacion='" + m_identificacion + '\'' +
                ", m_usuario=" + m_usuario +
                ", m_idUsuario=" + m_idUsuario +
                ", m_ultimoInicioSesion=" + m_ultimoInicioSesion +
                ", m_activo=" + m_activo +
                ", m_claveActivacion='" + m_claveActivacion + '\'' +
                ", m_idDominio=" + m_idDominio +
                "} " + super.toString();
    }
}
